package com.ctshk.rpc.starvip.factory.transaction;

import com.ctshk.common.enums.OrderSource;
import com.ctshk.common.utils.EntityUtil;
import com.ctshk.common.utils.SnowflakeIdWorker;
import com.ctshk.rpc.starvip.dto.start_vip.SiebelMessage;
import com.ctshk.rpc.starvip.dto.start_vip.transaction.ListOfLoyEaiTransaction;
import com.ctshk.rpc.starvip.dto.start_vip.transaction.LoyTransaction;
import com.ctshk.rpc.starvip.dto.start_vip.transaction.TransactionDTO;
import com.ctshk.rpc.starvip.enums.transaction.*;
import com.ctshk.rpc.starvip.factory.StarVipReqProvider;
import com.ctshk.rpc.starvip.req.transaction.StarVipTransactionReq;

import java.math.BigDecimal;
import java.util.Optional;

/**
 * @BelongsProject: ctshk-cloud
 * @BelongsPackage: com.ctshk.rpc.starvip.factory.transaction
 * @Author: hef
 * @CreateTime: 2021-04-14 09:42
 * @Description: 描述
 */
public class TransactionReqFactory extends StarVipReqProvider<StarVipTransactionReq> {
    /**
     * 交易表示
     * true 交易
     * false 取消交易
     * 对于取消交易时接口的要求：
     * •	对于偿还交易的取消：对接系统需要新建一笔交易，该交易的点数子类型为”调整积分”，
     * 交易类型为”应计”，交易子类型为”产品”，产品为取消交易对应的产品，交易点数为取消交易的实际点数，是否定级积分和是否定级交易都必须为”N”。对于此类交易取消将会新增可用积分。定级积分，定级交易和生命周期积分不会累加；
     * •	对于应计交易的取消：对接系统
     *      新建一笔交易，该交易的点数子类型为”调整积分”，交易类型为”偿还”，交易子类型为”产品”，
     *      产品为取消交易对应的产品，交易点数为取消交易的实际点数，是否定级积分和取消的交易保持一致，是否定级交易也和取消的交易保持一致。当该取消交易执行后，将会扣减可用积分和生命周期积分；定级积分和定级交易也将根据交易上的实际情况来执行
     */
    private boolean transactionFlag;

    public TransactionReqFactory(StarVipTransactionReq req, boolean transactionFlag) {
        super(req);
        this.transactionFlag = transactionFlag;
    }

    @Override
    public SiebelMessage produce() {
        TransactionDTO dto = new TransactionDTO();
        dto.setMessageId("String");
        dto.setIntObjectName("CTS LOY Transaction");
        dto.setInterfaceId("CTS_IF_11");
        dto.setOperation("Insert");
        dto.setMessageType("Integration Object");
        dto.setIntObjectFormat("Siebel Hierarchical");
        dto.setXmlns("http://www.w3.org/2001/XMLSchema-instance");
        LoyTransaction loyTransaction = EntityUtil.copy(req, LoyTransaction.class);
        loyTransaction.setCtsTransactionOrgCode("219910000000");
        if(req.getOrderSource() != null) {
            if(OrderSource.CPM.getCode().equals(req.getOrderSource())) {
                loyTransaction.setTransactionChannel(StarVipTransactionChannel.STORE.getCode());
                loyTransaction.setCtsTransactionChannelSN(StarVipTransactionChannelSN.SALES_CENTRE_HK_AND_MACAU.getSn());
            } else if(OrderSource.CPM_PROXY.getCode().equals(req.getOrderSource())) {
                loyTransaction.setTransactionChannel(StarVipTransactionChannel.STORE.getCode());
                loyTransaction.setCtsTransactionChannelSN(StarVipTransactionChannelSN.AGENT.getSn());
            } else {
                loyTransaction.setTransactionChannel(StarVipTransactionChannel.WEBSITE.getCode());
                loyTransaction.setCtsTransactionChannelSN(StarVipTransactionChannelSN.WEBSITE.getSn());
            }
        } else {
            loyTransaction.setCtsTransactionChannelSN("211099000000");
            loyTransaction.setTransactionChannel(StarVipTransactionChannel.OTHER.getCode());
        }

        loyTransaction.setTransactionNumber(req.getTransactionNumber());
        loyTransaction.setCtsOrderNum(req.getCtsOrderNum());
        loyTransaction.setPartNumber(Optional.ofNullable(req.getPartNumber()).orElse("8821510000"));
        loyTransaction.setPartnerLocation("2199");
        loyTransaction.setCtsProdCode(req.getCtsProdCode());
        loyTransaction.setCtsProdDesc(req.getCtsProdDesc());
        //交易
        if (transactionFlag) {
            loyTransaction.setCtsPointSubTypeCode(StarVipPointSubTypeCode.CONSUMPTION_POINTS.getCode());
            loyTransaction.setTransactionType(req.getTransactionType().getCode());
            loyTransaction.setTransactionSubType(req.getTransactionSubType().getCode());
            loyTransaction.setAmount(Optional.ofNullable(req.getAmount()).orElse(BigDecimal.ZERO));
            loyTransaction.setCtsRMBAmount(Optional.ofNullable(req.getCtsRMBAmount()).orElse(BigDecimal.ZERO));
            if("Y".equals(req.getCtsQualifyTxnFlag())) {
                loyTransaction.setQualifyingFlag("Y");
                loyTransaction.setCtsQualifyTxnFlag("Y");
            }
        }
        //取消交易
        /*
        对于取消交易时接口的要求：
      •	对于偿还交易的取消：对接系统需要新建一笔交易，该交易的点数子类型为”调整积分”，
            交易类型为”应计”，交易子类型为”产品”，产品为取消交易对应的产品，
            交易点数为取消交易的实际点数，是否定级积分和是否定级交易都必须为”N”。
            对于此类交易取消将会新增可用积分。定级积分，定级交易和生命周期积分不会累加；
      •	对于应计交易的取消：对接系统新建一笔交易，该交易的点数子类型为”调整积分”，
           交易类型为”偿还”，交易子类型为”产品”，
           产品为取消交易对应的产品，交易点数为取消交易的实际点数，是否定级积分和取消的交易保持一致，
           是否定级交易也和取消的交易保持一致。
           当该取消交易执行后，将会扣减可用积分和生命周期积分；定级积分和定级交易也将根据交易上的实际情况来执行
         */
        else {
            loyTransaction.setCtsPointSubTypeCode(StarVipPointSubTypeCode.ADJUST_POINTS.getCode());
            loyTransaction.setTransactionType(
                    req.getTransactionType().equals(StarVipTransactionType.ACCRUAL) ?
                            StarVipTransactionType.REDEMPTION.getCode() :
                            StarVipTransactionType.ACCRUAL.getCode()
            );
            loyTransaction.setTransactionSubType(StarVipTransactionSubType.PRODUCT.getCode());
            if (loyTransaction.getTransactionType().equals(StarVipTransactionType.REDEMPTION.getCode())) {
                loyTransaction.setQualifyingFlag(req.getCtsQualifyTxnFlag());
                loyTransaction.setCtsQualifyTxnFlag(req.getCtsQualifyTxnFlag());
            }
        }
        if (req.getCurrencyCode() != null) {
            loyTransaction.setCurrencyCode(req.getCurrencyCode().getCode());
        }
        loyTransaction.setPointName("港中旅积分");
        loyTransaction.setProgramName("港中旅集团忠诚度计划");
        dto.setListOfLoyEaiTransaction(new ListOfLoyEaiTransaction(
                loyTransaction
        ));
        return dto;
    }
}
